#include "user.h"

//SCL-PB8.SDA-PB9
void iic_init()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);

    GPIO_InitTypeDef gpioStruct;
    gpioStruct.GPIO_Mode=GPIO_Mode_OUT;
    gpioStruct.GPIO_OType=GPIO_OType_OD;
    gpioStruct.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
    gpioStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpioStruct.GPIO_Speed=GPIO_Low_Speed;
    GPIO_Init(GPIOB,&gpioStruct);
}

void iic_start()
{
    GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_8);
    delay_ws(2);
    GPIO_ResetBits(GPIOB,GPIO_Pin_9);
    delay_ws(2);
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
}

void iic_end()
{
    GPIO_ResetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_8);
    delay_ws(2);
    GPIO_SetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
    GPIO_SetBits(GPIOB,GPIO_Pin_9);
    delay_ws(2);
}

uint8_t iic_get_ack()
{
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
    GPIO_SetBits(GPIOB,GPIO_Pin_9);
    delay_ws(2);
    GPIO_SetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9))
    {
        return 1;
    }
    else
    {
        GPIO_ResetBits(GPIOB,GPIO_Pin_8);
        delay_ws(2);
        return 0;
    }
}

void iic_send_ack(uint8_t signal)
{
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
    if(signal==1)
    {
        GPIO_SetBits(GPIOB,GPIO_Pin_9);
    }
    else if(signal==0)
    {
        GPIO_ResetBits(GPIOB,GPIO_Pin_9);
    }
    GPIO_SetBits(GPIOB,GPIO_Pin_8);
    delay_ws(4);
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
}

void iic_send_data(uint8_t data)
{
    for(int i=0; i<8; i++)
    {
        GPIO_ResetBits(GPIOB,GPIO_Pin_8);
        delay_ws(2);
        if((data>>(7-i))&0x1)
        {
            GPIO_SetBits(GPIOB,GPIO_Pin_9);
        }
        else
        {
            GPIO_ResetBits(GPIOB,GPIO_Pin_9);
        }
        GPIO_SetBits(GPIOB,GPIO_Pin_8);
        delay_ws(4);
    }
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
}

uint8_t iic_rec_data()
{
    uint8_t data=0;
    GPIO_ResetBits(GPIOB,GPIO_Pin_8);
    delay_ws(2);
    GPIO_SetBits(GPIOB,GPIO_Pin_9);
    delay_ws(2);

    for(int i=0; i<8; i++)
    {
        data<<=1;
        GPIO_SetBits(GPIOB,GPIO_Pin_8);
        delay_ws(2);
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9))
        {
            data|=0x1;
        }
        GPIO_ResetBits(GPIOB,GPIO_Pin_8);
        delay_ws(2);
    }
	return data;
}
